home *** CD-ROM | disk | FTP | other *** search
/ Internet Publisher's Toolbox 2.0 / Internet Publisher's Toolbox.iso / internet / ntserver / wtsource / synonym.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-11  |  3.8 KB  |  140 lines

  1.  
  2. /* Copyright (c) CNIDR (see ../COPYRIGHT) */
  3.  
  4. #include "synonym.h"
  5. #include "cutil.h"
  6.  
  7. #ifdef WIN32
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <search.h>
  11. #endif
  12.          
  13. #ifdef WIN32
  14. int     syn_compare (void *arg1, void *arg2)
  15. #else
  16. int     syn_compare (arg1, arg2)
  17.         void * arg1, *arg2;
  18. #endif
  19. {
  20.     t_Synonym * p1, *p2;
  21.     p1 = (t_Synonym *) arg1;
  22.     p2 = (t_Synonym *) arg2;
  23. #ifdef WIN32
  24.     return _stricmp (p1 -> key, p2 -> key);
  25. #else
  26.     return strcasecmp (p1 -> key, p2 -> key);
  27. #endif
  28. }
  29.  
  30. char   *lookup_Synonym (word, syn_Table, syn_Table_Size)
  31. char   *word;
  32. t_Synonym * syn_Table;
  33. int     syn_Table_Size;
  34. {
  35.     t_Synonym tmp;
  36.     t_Synonym * rec;
  37.     if (syn_Table_Size == 0)
  38.     return word;
  39.     tmp.key = (char *) s_malloc (strlen (word) + 1);
  40.     strcpy (tmp.key, word);
  41. #ifdef WIN32
  42.     rec = (t_Synonym *) bsearch ((void *)&tmp, (void *)syn_Table, (size_t)syn_Table_Size,
  43.                 sizeof (t_Synonym), (int (*)(const void*, const void*))syn_compare);
  44. #else
  45.     rec = (t_Synonym *) bsearch (&tmp, syn_Table, syn_Table_Size, sizeof (t_Synonym), syn_compare);
  46. #endif
  47.     s_free (tmp.key);
  48.     if (rec)
  49.     return rec -> root;
  50.     return word;
  51. }
  52. void syn_ReadFile (fn, ptr, syn_Table_Size)
  53. char   *fn;
  54. t_Synonym ** ptr;
  55. int    *syn_Table_Size;
  56. {
  57.     char   *key,
  58.            *datum,
  59.             inputLine[SYN_FILE_LINE_LENGTH];
  60.     FILE * fp = fopen (fn, "rb");
  61.     t_Synonym * syn_Table = NULL;
  62.     *syn_Table_Size = 0;
  63.     if (!fp) {
  64.     waislog (WLOG_HIGH, WLOG_WARNING, "Warning: couldn't open %s - translation disabled", fn);
  65.     return;
  66.     }
  67.     syn_Table = (t_Synonym *) s_malloc (sizeof (t_Synonym));
  68.     if (!syn_Table) {
  69.     waislog (WLOG_HIGH, WLOG_WARNING, "Warning: error allocating space for %s - translation disabled", fn);
  70.     return;
  71.     }
  72.     while (!feof (fp)) {
  73.     fgets (inputLine, SYN_FILE_LINE_LENGTH - 1, fp);
  74.     datum = (char *) strtok (inputLine, " \n\r");
  75.     if (datum[0] != '#')    /* skip comment lines */
  76.         while ((key = (char *) strtok (NULL, " \n\r"))) {
  77.         (*syn_Table_Size)++;
  78.         syn_Table =
  79.             (t_Synonym *) realloc (syn_Table, (*syn_Table_Size) * sizeof (t_Synonym));
  80.         if (!syn_Table) {
  81.             waislog (WLOG_HIGH, WLOG_WARNING, "Warning: error allocating space for %s - translation disabled", fn);
  82.             (*syn_Table_Size)--;
  83.             return;
  84.         }
  85.         synptr (root) = (char *) s_malloc (strlen (datum) + 1);
  86.         synptr (key) = (char *) s_malloc (strlen (key) + 1);
  87.         if (!synptr (root) || !synptr (key)) {
  88.             waislog (WLOG_HIGH, WLOG_WARNING, "Warning: error allocating space for %s - translation disabled", fn);
  89.             return;
  90.         }
  91.         strcpy (synptr (root), datum);
  92.         strcpy (synptr (key), key);
  93.         }
  94.     }
  95.     fclose (fp);
  96. #ifdef WIN32
  97.     qsort ((void *)syn_Table, (size_t)(*syn_Table_Size), sizeof (t_Synonym), (int (*)(const void*, const void*))syn_compare);
  98. #else
  99.     qsort (syn_Table, (*syn_Table_Size), sizeof (t_Synonym), syn_compare);
  100. #endif
  101.     (*ptr) = (t_Synonym *) syn_Table;
  102.     return;
  103. }
  104.  
  105. void syn_Free (syn_Table, syn_Table_Size)
  106. t_Synonym * syn_Table;
  107. int    *syn_Table_Size;
  108. {
  109.     int     i;
  110.     for (i = 0; i < (*syn_Table_Size); i++) {
  111.     s_free (syn_Table[i].root);
  112.     s_free (syn_Table[i].key);
  113.     }
  114.     s_free (syn_Table);
  115.     syn_Table = NULL;
  116.     syn_Table_Size = 0;
  117.     return;
  118. }
  119.  
  120. /* 
  121.    test stub for synonym routines 
  122.  
  123. char* log_file_name=NULL;
  124. FILE* logfile;
  125. main( argc,argv )
  126. int argc;
  127. char* argv[];
  128. {
  129.   char word[256];  
  130.   t_Synonym* syn_Table;
  131.   int syn_Table_Size;
  132.   logfile=stderr;
  133.   log_file_name="/dev/null";
  134.   syn_ReadFile( "test.syn",&syn_Table,&syn_Table_Size );
  135.   printf( "%s",lookup_Synonym( argv[1],syn_Table,syn_Table_Size ));
  136.   syn_Free( syn_Table,&syn_Table_Size );
  137. }   
  138.  
  139. */
  140.